﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using Noris.Tools.TraceVisualiser.Components;

namespace Noris.Tools.TraceVisualiser.Support
{
    /// <summary>
    /// Panel konfigurace
    /// </summary>
	internal class ConfigPanel : AutoScrollPanel
    {
        #region Konstrukce
        public ConfigPanel()
		{
			this.Init();
		}
		protected void Init()
		{
            this.Size = new Size(510, 540);
            this.MinimumSize = new System.Drawing.Size(100, 100);
            int lx = 3;
            int lw = this.Size.Width - 6;
            int y = 3;
            int tabIndex = 0;

            this.BackModes = new List<StringTag>() {
                new StringTag("Výchozí (TraceVisualiser)", Config.MainBackgroundMode.InternalTile),
                new StringTag("Standardní TraceAnalyser", Config.MainBackgroundMode.StandardTraceAnalyser),
                new StringTag("Standardní (Windows)", Config.MainBackgroundMode.StandardWindows),
                new StringTag("Jednobarevné", Config.MainBackgroundMode.FullColor),
                new StringTag("Vzorek z obrázku", Config.MainBackgroundMode.ImageTile),
                new StringTag("Wallpaper", Config.MainBackgroundMode.ImageCenter) };

            this.SuspendLayout();

            this._LineDoc = new HLine() { Bounds = new Rectangle(lx, y, lw, 21), Text = "Práce s dokumenty", Font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(238))) }; y += 27;
            this._DocSimpleChk = new CheckBox() { Bounds = new Rectangle(28, y, 200, 17), AutoSize = true, Text = "Povolit zjednodušené zadávání projektů", TabIndex = tabIndex++, TabStop = true, UseVisualStyleBackColor = true }; y += 20;
            this._DocAutosaveChk = new CheckBox() { Bounds = new Rectangle(28, y, 200, 17), AutoSize = true, Text = "Automaticky ukládat po každé změně", TabIndex = tabIndex++, TabStop = true, UseVisualStyleBackColor = true }; y += 20;
            this._DocOpenLastChk = new CheckBox() { Bounds = new Rectangle(28, y, 200, 17), AutoSize = true, Text = "Při příštím spuštění aplikace otevřít dokumenty minule otevřené", TabIndex = tabIndex++, TabStop = true, UseVisualStyleBackColor = true }; y += 20;
            this.ToolTip.SetToolTip(this._DocSimpleChk, "Pro Nový projekt se otevře záložka s jednoduchým výběrem dokumentů a s automatizovaným vytvořením projektu.");
            this.ToolTip.SetToolTip(this._DocAutosaveChk, "Do souboru projektu bude ukládat každou změnu ihned po jejím provedení a potvrzení.");
            this.ToolTip.SetToolTip(this._DocOpenLastChk, "Po spuštění aplikace zobrazí ty projekty, které byly otevřené při posledním zavírání aplikace. Provede se pouze při spouštění bez parametrů, bez otevřeného projektu TraceAnalyzeru.");
            this.Controls.Add(_DocSimpleChk);
            this.Controls.Add(_DocAutosaveChk);
            this.Controls.Add(_DocOpenLastChk);

            y += 9;
            this._LineRecent = new HLine() { Bounds = new Rectangle(lx, y, lw, 21), Text = "Nedávné soubory", Font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(238))) }; y += 27;
            this._RecentLabel = new Label() { Bounds = new Rectangle(25, y + 3, 224, 13), AutoSize = true, Text = "Počet nedávných souborů v nabídce Soubor:" };
            this._RecentCountUpDown = new NumericUpDown() { Bounds = new Rectangle(255, y + 1, 50, 20), TextAlign = HorizontalAlignment.Right, Minimum = 0, Maximum = 40, TabIndex = tabIndex++, TabStop = true };
            this._RecentClearBtn = new Button() { Bounds = new Rectangle(311, y - 1, 138, 23), Text = "Smazat seznam", TabIndex = tabIndex++, TabStop = true, UseVisualStyleBackColor = true }; y += 27;
			this._RecentClearBtn.Click += new EventHandler(_RecentClearBtn_Click);
            this.Controls.Add(_RecentLabel);
            this.Controls.Add(_RecentCountUpDown);
            this.Controls.Add(_RecentClearBtn);

            y += 9;
            this._LineApp = new HLine() { Bounds = new Rectangle(lx, y, lw, 21), Text = "Chování aplikace", Font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(238))) }; y += 27;
            this._FormClosingQueryChk = new CheckBox() { Bounds = new Rectangle(28, y, 200, 17), AutoSize = true, Text = "Dotaz před zavřením aplikace", TabIndex = tabIndex++, TabStop = true, UseVisualStyleBackColor = true }; y += 20;
            this.ToolTip.SetToolTip(this._FormClosingQueryChk, "Před zavřením aplikace, pokud jsou otevřeny nějaké projekty, se pro jistotu zeptá zda si to uživatel jen nespletl.");
            this.Controls.Add(this._FormClosingQueryChk);
            this._TraceAutoTimeShiftChk = new CheckBox() { Bounds = new Rectangle(28, y, 200, 17), AutoSize = true, Text = "Automaticky detekovat časový posun Klient-Server", TabIndex = tabIndex++, TabStop = true, UseVisualStyleBackColor = true }; y += 20;
            this.ToolTip.SetToolTip(this._TraceAutoTimeShiftChk, "Automaticky posune události klientského trace tak, aby časově odpovídaly časové ose aplikačního serveru.");
            this.Controls.Add(this._TraceAutoTimeShiftChk);

            y += 9;
            this._LineSearch = new HLine() { Bounds = new Rectangle(lx, y, lw, 21), Text = "Vyhledávání", Font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(238))) }; y += 27;
            this._SearchLabel = new Label() { Bounds = new Rectangle(25, y + 3, 224, 13), AutoSize = true, Text = "Počet vyhledaných událostí, po kterém se vyhledávání pozastaví:" };
            this._SearchCountUpDown = new NumericUpDown() { Bounds = new Rectangle(370, y + 1, 50, 20), TextAlign = HorizontalAlignment.Right, Minimum = 0, Maximum = 1000, TabIndex = tabIndex++, TabStop = true }; y += 20;
            this.ToolTip.SetToolTip(this._SearchCountUpDown, "Vyhledávání se pozastaví vždy po nalezení tohoto počtu událostí." + Environment.NewLine + "Vyhledávání je pak možno spustit dál (pokračovat) nebo zrušit." + Environment.NewLine + "Počet = 0: vyhledávání nebude samo zastavovat.");
            this.Controls.Add(_SearchLabel);
            this.Controls.Add(_SearchCountUpDown);

            y += 9;
            this._LineBgr = new HLine() { Bounds = new Rectangle(lx, y, lw, 21), Text = "Vzhled pozadí aplikace", Font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(238))) }; y += 27;
            this._BackgroundMode = new ComboBox() { Bounds = new Rectangle(28, y, 277, 21), FormattingEnabled = true, TabIndex = tabIndex++, TabStop = true, DropDownStyle = ComboBoxStyle.DropDownList };
            this._BackgroundMode.Items.AddRange(this.BackModes.Cast<object>().ToArray());
			this._BackgroundMode.SelectedIndexChanged += new EventHandler(_BackgroundMode_SelectedIndexChanged);
            this._BackColorPanel = new ColorSelectPanel() { Bounds = new Rectangle(311, y, 193, 22), TabIndex = tabIndex++, TabStop = true, Anchor = (AnchorStyles)(AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right) }; y += 35;
			this._BackColorPanel.SelectedColorChanged += new EventHandler(_BackColorPanel_SelectedColorChanged);
            this._BackImageLabel = new Label() { Bounds = new Rectangle(25, y, 101, 13), AutoSize = true, Text = "Soubor s obrázkem:" }; y -= 8;
            this._BackImageFile = new FileSelectPanel() { Bounds = new Rectangle(132, y, 372, 22), TabIndex = tabIndex++, TabStop = true, Anchor = (AnchorStyles)(AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right) }; y += 27;
			this._BackImageFile.Filter = "All Images|*.jpg;*.jpeg;*.gif;*.png;*.bmp|All Files(*.*)|*.*";
			this._BackImageFile.FilterIndex = 1;
            this.Controls.Add(this._BackgroundMode);
            this.Controls.Add(this._BackColorPanel);
            this.Controls.Add(this._BackImageLabel);
            this.Controls.Add(this._BackImageFile);

            this.Controls.Add(_LineDoc);
            this.Controls.Add(_LineRecent);
            this.Controls.Add(_LineApp);
            this.Controls.Add(_LineSearch);
            this.Controls.Add(_LineBgr);

            this.ResumeLayout(false);
            this.PerformLayout();
		}
		void _RecentClearBtn_Click(object sender, EventArgs e)
		{
			this.AppConfig.LastProjectsClear();
		}
		void _BackColorPanel_SelectedColorChanged(object sender, EventArgs e)
		{
			this.SelectedColorChangedHandler();
		}
		void _BackgroundMode_SelectedIndexChanged(object sender, EventArgs e)
		{
			this.BackgroundModeChangedHandler();
		}
		private Components.HLine _LineDoc;
        private System.Windows.Forms.CheckBox _DocSimpleChk;
        private System.Windows.Forms.CheckBox _DocAutosaveChk;
        private System.Windows.Forms.CheckBox _DocOpenLastChk;
        private Components.HLine _LineRecent;
        private System.Windows.Forms.Label _RecentLabel;
        private System.Windows.Forms.NumericUpDown _RecentCountUpDown;
        private System.Windows.Forms.Button _RecentClearBtn;
        private Components.HLine _LineApp;
        private System.Windows.Forms.CheckBox _FormClosingQueryChk;
        private System.Windows.Forms.CheckBox _TraceAutoTimeShiftChk;

        private Components.HLine _LineSearch;
        private System.Windows.Forms.Label _SearchLabel;
        private System.Windows.Forms.NumericUpDown _SearchCountUpDown;

        private Components.HLine _LineBgr;
        private System.Windows.Forms.ComboBox _BackgroundMode;
        private ColorSelectPanel _BackColorPanel;
        private System.Windows.Forms.Label _BackImageLabel;
        private FileSelectPanel _BackImageFile;
        private List<StringTag> BackModes;
        public override DockStyle Dock
        {
            get { return base.Dock; }
            set { _SetDock(value); }
        }
        private void _SetDock(DockStyle value)
        {
            bool isVDock = (value == DockStyle.Fill || value == DockStyle.Top || value == DockStyle.Bottom);  // true když se dokuje na šířku
            base.Dock = value;
            if (isVDock)
                this.MinimumSize = Size.Empty;
            else
                this.MinimumSize = Size.Empty; //  new System.Drawing.Size(455, 250);
        }
        #endregion
        #region Vazba na data
        /// <summary>
        /// Objekt s konfigurací. 
        /// Nejprve je nutno jej vložit, panel si z něj načte data a uloží si referenci na něj.
        /// Pokud se mají data z panelu posbírat a vložit do Configu, je třeba přečíst hodnotu z této property. Bude vrácen původní objekt, ale s aktuálně zadanými daty.
        /// </summary>
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Browsable(false)]
        public Config AppConfig
        {
            get { return this._GetConfig(); }
            set { this._SetConfig(value); }
        }
        private Config _AppConfig;
        private void _SetConfig(Config appConfig)
        {
            this._AppConfig = appConfig;
            if (appConfig == null) return;
            bool isStartedFromTA = Steward.IsStartedFromTA;

            this._DocSimpleChk.Checked = appConfig.DocSimpleEnabled;
            this._DocAutosaveChk.Checked = appConfig.DocAutosaveEnabled;
            this._DocOpenLastChk.Checked = appConfig.DocOpenLastEnabled;
            this._RecentCountUpDown.Value = appConfig.LastProjectsCount;
            this._SearchCountUpDown.Value = appConfig.SearchItemsCount;
            this._BackColorPanel.SelectedColor = appConfig.BackgroundColor;
            this._BackImageFile.SelectedPath = appConfig.BackgroundImageFile;
            this._FormClosingQueryChk.Checked = appConfig.FormClosingQuery;
            this._TraceAutoTimeShiftChk.Checked = appConfig.TraceAutoTimeShift;

            // Nastavení hodnoty this.SelectedBackgroundMode vybere do ComboBoxu odpovídající položku a vyvolá event BackgroundModeChangedHandler(), 
			//    který reaguje na změnu a nastaví Enabled + Visible na odpovídající Controly,
			//    ale rovněž (za jistých podmínek) převezme barvu this.LastFullColor a dá ji do this._BackColorPanel.SelectedColor:
			this.LastFullColor = appConfig.BackgroundColor;
            this.SelectedBackgroundMode = (isStartedFromTA ? Config.MainBackgroundMode.StandardTraceAnalyser : appConfig.BackgroundMode);

            // Blokovat některé nastavení při spuštění z TraceAnalyseru:
            if (isStartedFromTA)
            {
                this._BackgroundMode.Enabled = false;
            }

        }
        private Config _GetConfig()
        {
            Config appConfig = this._AppConfig;
            if (appConfig == null) return null;

            appConfig.DocSimpleEnabled = this._DocSimpleChk.Checked;
            appConfig.DocAutosaveEnabled = this._DocAutosaveChk.Checked;
            appConfig.DocOpenLastEnabled = this._DocOpenLastChk.Checked;
            appConfig.LastProjectsCount = (int)this._RecentCountUpDown.Value;
            appConfig.LastProjectsTrim();
            appConfig.SearchItemsCount = (int)this._SearchCountUpDown.Value;

            if (!Steward.IsStartedFromTA)
            {
                appConfig.BackgroundMode = this.SelectedBackgroundMode;
                appConfig.BackgroundColor = this._BackColorPanel.SelectedColor;
                appConfig.BackgroundImageFile = this._BackImageFile.SelectedPath;
            }

            appConfig.FormClosingQuery = this._FormClosingQueryChk.Checked;
            appConfig.TraceAutoTimeShift = this._TraceAutoTimeShiftChk.Checked;

            return appConfig;
        }
		protected Config.MainBackgroundMode SelectedBackgroundMode
		{
			get
			{
				Config.MainBackgroundMode mode = Config.MainBackgroundMode.StandardWindows;
				object selected = this._BackgroundMode.SelectedItem;
				if (selected is StringTag)
				{
					StringTag stringTag = (StringTag)selected;
					if (stringTag.Tag is Config.MainBackgroundMode)
						mode = (Config.MainBackgroundMode)stringTag.Tag;
				}
				return mode;
			}
			set
			{
				this._BackgroundMode.SelectedItem = this.BackModes.FirstOrDefault(i => ((Noris.Tools.TraceVisualiser.Support.Config.MainBackgroundMode)i.Tag == value));
			}
		}
		protected virtual void BackgroundModeChangedHandler()
		{
			Config.MainBackgroundMode mode = this.SelectedBackgroundMode;
			switch (mode)
			{
				case Config.MainBackgroundMode.None:
				case Config.MainBackgroundMode.StandardWindows:
					this._BackColorPanel.Enabled = false;
					this._BackColorPanel.Visible = true;
					this._BackColorPanel.SelectedColor = SystemColors.AppWorkspace;
                    this._BackImageLabel.Visible = false;
					this._BackImageFile.Visible = false;
					break;
                case Config.MainBackgroundMode.StandardTraceAnalyser:
                    this._BackColorPanel.Enabled = false;
                    this._BackColorPanel.Visible = true;
                    this._BackColorPanel.SelectedColor = Steward.TraceAnalyserBackColor;            // Požadavek JD + DCH z 2012-02-14
                    this._BackImageLabel.Visible = false;
                    this._BackImageFile.Visible = false;
                    break;
                case Config.MainBackgroundMode.FullColor:
					this._BackColorPanel.Enabled = true;
					this._BackColorPanel.Visible = true;
					this._BackColorPanel.SelectedColor = this.LastFullColor;
                    this._BackImageLabel.Visible = false;
					this._BackImageFile.Visible = false;
					break;
				case Config.MainBackgroundMode.ImageTile:
					this._BackColorPanel.Enabled = true;
					this._BackColorPanel.Visible = true;
					this._BackColorPanel.SelectedColor = this.LastFullColor;
                    this._BackImageLabel.Visible = true;
					this._BackImageFile.Visible = true;
					break;
				case Config.MainBackgroundMode.ImageCenter:
					this._BackColorPanel.Enabled = true;
					this._BackColorPanel.Visible = true;
					this._BackColorPanel.SelectedColor = this.LastFullColor;
                    this._BackImageLabel.Visible = true;
					this._BackImageFile.Visible = true;
					break;
				case Config.MainBackgroundMode.InternalTile:
					this._BackColorPanel.Visible = false;
                    this._BackImageLabel.Visible = false;
					this._BackImageFile.Visible = false;
					break;

			}
		}
		protected virtual void SelectedColorChangedHandler()
		{
			if (this.SelectedBackgroundMode == Config.MainBackgroundMode.FullColor ||
				this.SelectedBackgroundMode == Config.MainBackgroundMode.ImageCenter ||
				this.SelectedBackgroundMode == Config.MainBackgroundMode.ImageTile)
				this.LastFullColor = this._BackColorPanel.SelectedColor;
		}
		protected Color LastFullColor;
		#endregion
	}
}
